[Day 06]: Docker Network-2



容器網路

Docker 預設的網路型態即為透過 Network Namespace創建隔離的容器網路,並透過 Veth Pair (Virtual Ethernet Pair) 打穿 Network Namespace 並與 bridge 相通,再由 bridge 與 host 網卡相互連接

Bridge to Host

其實負責連接容器的 bridge 也是由 host 虛擬產生,並不能直接與 host 中的網卡溝通,那麼又是透過何種方法達成的呢?

答案是 Iptables !

Iptables

Linux 中用於網路過濾的程式
根據指定規則,最 netfilter進行操作
可實現 port之間的映射,使 外部主機可以存取容器的連接埠
也是防火牆的角色

藉由 DNAT(Destination Network Address Translation,目標網路位址轉換)來進行連接埠轉發功能

* docker run -d -P/-p 80:80 nginx

透過啟動指令中的 -P -p 參數,容器內連接埠映射至主機時,docker會在 iptables 新增一筆 以容器網路連到容器 的DNAT,透過Iptables 指令可查看

* iptables -t nat -L -n

若要從 host 中找出其隨機分配給與容器連接的port

可尋找 /proc/sys/net/ipv4/ip_local_port_range檔案中找到

* more /proc/sys/net/ipv4/ip_local_port_range
// 會回傳 映射的連接埠

總結,所以構成 docker 網路的有四個部分

  • Network Namespace
  • Veth Pair
  • Bridge
  • Iptables

以上為 docker 預設的網路模式


而隨著 docker技術的發展,逐漸形成 容器網路模型,CNM(Container Network Model)

此模型規範 Docker 容器使用網路的方式,使許多開發者可根據網路模型定義的結構與介面,進而實現所需的網路驅動程式

模型中主要為三大部分:

  • Sandbox:

    • 容器中隔離網路配置的虛擬環境,對照原本的網路實作,功能類似於原本的 Network Namespace
  • Endpoint:

    • 用來傳遞網路資料的通道入口,依附於沙盒之上,功能類似於原本的 Veth Pair
  • Network:
    • 由一組端點構成的網路,端點之間可相互通訊,功能類似於院本的 Linux Bridge

而一般 docker 還是採用最初的網路設計

* docker network ls

// 此指令可以看到 bridge、host 等詳細資訊

而 bridge 在 host 的網路中對應到的為 docker0 網路
用 ifconfig看會發現它在 host 中所建立的 docker0

* docker network inspect bridge

// 此指令可以看到容器網路中的詳細資訊,例如使用此網路的容器有哪些之類的...

自訂網路

在docker中除了預設網路外,亦可將不同容器組成一個小型模組,使其存取同個網路
並隔絕其他網路的容器

步驟

  1. 先建立一個可供容器進行連接的網路
* docker network create --driver bridge isolated
// --driver 指令網路驅動程式,預設使用bridge
  1. 從網路清單中找出已建好的網路
docker network ls / docker network inspect isolated
  1. 從網路清單中檢查新建網路與預設網路 網段是否一樣

  2. 若不同則成功,此時 連到isolated 網路的容器與連到預設網路的容器彼此相互隔絕無法通訊

容器與外部通訊

若容器享想與外界正常通訊,則要確定Ip forward功能是否正常

啟動 Docker Daemon時,可加入 --ip-forward參數來d控制 docker是否使用IP forward
預設為開啟,但開啟後若仍然無法與外部連線,則必須檢查 host是否有禁用 IP forward

* sudo sysctl net.ipv4.conf.all.forwarding

// 若返回值為0,則代表 host 禁用 IP forward

* sudo systcl net.ipv4.conf.all.forwarding = 1
// 令值為1,則啟用

由於電腦目前出狀況,可能會晚點補上截圖~


參考資料

[1]:
https://ithelp.ithome.com.tw/articles/10205481?sc=pt

#docker #虛擬化技術 #Network







你可能感興趣的文章

CH3. 對程式碼靈活性要求很高的問題

CH3. 對程式碼靈活性要求很高的問題

What is the concept of handle in Java?

What is the concept of handle in Java?

關於 ASUS AiMesh 架設三兩句

關於 ASUS AiMesh 架設三兩句






留言討論